/*
  Dart中的多态:
    允许将子类类型的指针赋值给父类类型的指针，同一个函数调用会有不同的执行效果。
    子类的实例赋值给父类的引用。
    多态就是父类定义一个方法不去实现，让继承他的子类去实现，每个子类有不同的表现。
*/ 

// 以本案例来说，父类Animal定义了eat方法但是没有去实现，而dog和cat两个子类分别进行了实现，每个子类对于eat方法都有不同的表现
abstract class Animal {
  eat(); //抽象方法，没有函数体，未来的子类必须要实现这个方法
}

// 使用implements关键字来实现抽象类
class Dog extends Animal {
  @override
  eat() {
    print('小狗在吃翔');
    return null;
  }
  run(){
    print('小狗在奔跑');
  }
}

class Cat extends Animal {
  @override
  eat() {
    print('小猫在吃鱼');
  }
}

void main() {
  // var animal = new Animal();//爆红，因为抽象类不能直接被实例化

  var dog = new Dog();
  dog.eat();

  var cat = new Cat();
  cat.eat();

  // 子类的实例赋值给父类的引用。未来只能调用到
  Animal dog2 = new Dog();
  // print(dog2.run());//爆红，因为父类身上并没有run方法
}
